library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.3.2     ✓ purrr   0.3.4
✓ tibble  3.0.4     ✓ dplyr   1.0.2
✓ tidyr   1.1.2     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.0
package ‘ggplot2’ was built under R version 3.6.2package ‘tibble’ was built under R version 3.6.2package ‘tidyr’ was built under R version 3.6.2package ‘readr’ was built under R version 3.6.2package ‘purrr’ was built under R version 3.6.2package ‘dplyr’ was built under R version 3.6.2── Conflicts ────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(janitor)
package ‘janitor’ was built under R version 3.6.2
Attaching package: ‘janitor’

The following objects are masked from ‘package:stats’:

    chisq.test, fisher.test
library(sf)
package ‘sf’ was built under R version 3.6.2Linking to GEOS 3.7.2, GDAL 2.4.2, PROJ 5.2.0
alc <- read_csv("~/Downloads/clean_alcohol_codes.csv")

── Column specification ────────────────────────────────────────────────────────────────
cols(
  feature_code = col_character(),
  date_code = col_character(),
  value_per_one_hundred_thousand_people = col_double(),
  alcohol_condition = col_character(),
  type_of_hospital = col_character()
)
health_board <- st_read("../raw_data/SG_NHS_HealthBoards_2019/SG_NHS_HealthBoards_2019.shp", quiet = TRUE)

head(health_board)
Simple feature collection with 6 features and 4 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 83941 ymin: 530250.8 xmax: 414219.1 ymax: 979400.7
CRS:            27700
     HBCode                HBName Shape_Leng  Shape_Area                       geometry
1 S08000015    Ayrshire and Arran   679782.3  3408802229 MULTIPOLYGON (((201916.2 60...
2 S08000016               Borders   525406.7  4742684960 MULTIPOLYGON (((345325.9 57...
3 S08000017 Dumfries and Galloway   830301.2  6676314851 MULTIPOLYGON (((266004.4 54...
4 S08000019          Forth Valley   430568.3  2733658721 MULTIPOLYGON (((256533 7405...
5 S08000020              Grampian   802844.3  8800885268 MULTIPOLYGON (((383521.2 77...
6 S08000022              Highland  8486537.7 33637044520 MULTIPOLYGON (((173254 6049...
  
health_board_simply <- st_simplify(health_board, dTolerance = 2000)
head(health_board_simply)
Simple feature collection with 6 features and 4 fields
geometry type:  GEOMETRY
dimension:      XY
bbox:           xmin: 91962.5 ymin: 530635.8 xmax: 413825.1 ymax: 976907.5
CRS:            27700
     HBCode                HBName Shape_Leng  Shape_Area                       geometry
1 S08000015    Ayrshire and Arran   679782.3  3408802229 MULTIPOLYGON (((225054.5 66...
2 S08000016               Borders   525406.7  4742684960 POLYGON ((345325.9 579663.3...
3 S08000017 Dumfries and Galloway   830301.2  6676314851 POLYGON ((275243.5 620000.1...
4 S08000019          Forth Valley   430568.3  2733658721 POLYGON ((256533 740502, 25...
5 S08000020              Grampian   802844.3  8800885268 POLYGON ((320000.1 871554.8...
6 S08000022              Highland  8486537.7 33637044520 MULTIPOLYGON (((171127.7 77...
plot(health_board_simply)

both_data <- full_join(alc, health_board_simply, by = c("feature_code" = "HBCode"))

both_health_data <- both_data %>% 
  filter(feature_code != "S92000003")

both_health_data
both_health_data %>% 
  filter(date_code == "2013/2014") %>% 
  ggplot(aes(fill = value_per_one_hundred_thousand_people,
                                    geometry = geometry)) +
  geom_sf() +
  theme_void() + 
  scale_fill_viridis_c(option = "plasma", trans = "sqrt") +
  labs(
      fill = "Stays per 100,000 population"
  )

data_zone <- read_csv("~/Downloads/Datazone2011lookup.csv")

── Column specification ────────────────────────────────────────────────────────────────
cols(
  .default = col_character(),
  UR2_Code = col_double(),
  UR3_Code = col_double(),
  UR6_Code = col_double(),
  UR8_Code = col_double()
)
ℹ Use `spec()` for the full column specifications.
names(data_zone)
 [1] "DZ2011_Code"   "DZ2011_Name"   "IZ2011_Code"   "IZ2011_Name"   "MMWard_Code"  
 [6] "MMWard_Name"   "LA_Code"       "LA_Name"       "SPC_Code"      "SPC_Name"     
[11] "UKPC_Code"     "UKPC_Name"     "HB_Code"       "HB_Name"       "HIA_Code"     
[16] "HIA_Name"      "SPD_Code"      "SPD_Name"      "SFRLSO_Code"   "SFRLSO_Name"  
[21] "SFRSDA_Code"   "SFRSDA_Name"   "RRP_Code"      "RRP_Name"      "LRP_Code"     
[26] "LRP_Name"      "TTWA2011_Code" "TTWA2011_Name" "UR2_Code"      "UR2_Name"     
[31] "UR3_Code"      "UR3_Name"      "UR6_Code"      "UR6_Name"      "UR8_Code"     
[36] "UR8_Name"      "Country_Code"  "Country_Name" 
new_hb <- data_zone %>% 
  select(LA_Code, LA_Name, HB_Code, HB_Name)

new_hb
alc_raw_data <- read_csv("../raw_data/alcohol_related_hospital_stats.csv") %>% 
  clean_names()

── Column specification ────────────────────────────────────────────────────────────────
cols(
  FeatureCode = col_character(),
  DateCode = col_character(),
  Measurement = col_character(),
  Units = col_character(),
  Value = col_double(),
  `Alcohol Condition` = col_character(),
  `Alcohol Related Hospital Activity` = col_character(),
  `Type Of Hospital` = col_character()
)
alc_data <- alc_raw_data %>% 
  filter(date_code %in% c("2016/2017","2011/2012","2012/2013", "2010/2011", "2015/2016", "2009/2010", "2014/2015", "2018/2019", "2017/2018", "2013/2014"))  %>% 
  rename(year = date_code) %>% 
  mutate(measurement = str_to_lower(measurement)) %>% 
  mutate(units = str_to_lower(units)) %>%  
  rename(hospital_activity = alcohol_related_hospital_activity) %>% 
  mutate(hospital_activity = str_to_lower(hospital_activity)) %>% 
  mutate(type_of_hospital = str_to_lower(type_of_hospital)) %>% 
  mutate(year = factor(year, levels = c("2009/2010", "2010/2011", "2011/2012", "2012/2013", "2013/2014", "2014/2015", "2015/2016", "2016/2017", "2017/2018",  "2018/2019")))

alc_data 
alc_clean <- alc_data %>% 
  filter(measurement == "ratio") %>% 
  filter(hospital_activity == "stays")

alc_clean
both_alc_data <- inner_join(alc_clean, new_hb, by = c("feature_code" = "LA_Code"))
both_alc_data
super_puper_data <- distinct(both_alc_data)
super_puper_data
super_duper_data <- alc_data %>% 
  mutate(hb_assign = case_when(
                               feature_code == "S12000033" ~ "S08000020",
                               feature_code == "S12000034" ~ "S08000020",
                               feature_code == "S12000041" ~ "S08000030",
                               feature_code == "S12000035" ~ "S08000022",
                               feature_code == "S12000005" ~ "S08000019",
                               feature_code == "S12000006" ~ "S08000017",
                               feature_code == "S12000042" ~ "S08000030",
                               feature_code == "S12000008" ~ "S08000015",
                               feature_code == "S12000045" ~ "S08000031",
                               feature_code == "S12000010" ~ "S08000024",
                               feature_code == "S12000011" ~ "S08000031",
                               feature_code == "S12000036" ~ "S08000024",
                               feature_code == "S12000013" ~ "S08000028",
                               feature_code == "S12000014" ~ "S08000019",
                               feature_code == "S12000047" ~ "S08000029",
                               feature_code == "S12000049" ~ "S08000031",
                               feature_code == "S12000017" ~ "S08000022",
                               feature_code == "S12000018" ~ "S08000031",
                               feature_code == "S12000019" ~ "S08000024",
                               feature_code == "S12000020" ~ "S08000020",
                               feature_code == "S12000021" ~ "S08000015",
                               feature_code == "S12000050" ~ "S08000032",
                               feature_code == "S12000023" ~ "S08000025",
                               feature_code == "S12000048" ~ "S08000030",
                               feature_code == "S12000038" ~ "S08000031",
                               feature_code == "S12000026" ~ "S08000016",
                               feature_code == "S12000027" ~ "S08000026",
                               feature_code == "S12000028" ~ "S08000015",
                               feature_code == "S12000029" ~ "S08000032",
                               feature_code == "S12000030" ~ "S08000019",
                               feature_code == "S12000039" ~ "S08000031",
                               feature_code == "S12000040" ~ "S08000024"))
final_data <- super_duper_data  %>% 
  filter(!is.na(hb_assign))  %>% 
  filter(hospital_activity == "stays") %>%
      filter(alcohol_condition != "All alcohol conditions", alcohol_condition != 
               "All mental & behavioural disorders due to use of alcohol (M&B)",
             alcohol_condition != "All Alcoholic Liver Disease (ALD)") %>% 
  mutate(alcohol_condition = str_remove_all(alcohol_condition, "M\\&B\\ \\-\\ ")) %>% 
  mutate(alcohol_condition = str_remove_all(alcohol_condition, "ALD\\ \\-\\ ")) %>%
  filter(type_of_hospital == "general acute hospital")
library(plotly)
package ‘plotly’ was built under R version 3.6.2Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
ggplotly(final_final_data %>% 
      filter(year == "2013/2014") %>%
      filter(HBName == "Greater Glasgow and Clyde") %>% 
      filter(measurement == "ratio") %>%  
      ggplot() +
      aes(x = reorder(alcohol_condition, value),
          y = value,
          fill = alcohol_condition) +
      geom_col() +
      theme_classic() +
      labs(
        title = "Reasons of longest stays",
        x = "Condition",
        y = "Stays per 100,000") +
      theme(legend.position = "none") +
  coord_flip() +
  scale_y_continuous(breaks = c(0,300,600,900,1200,1500,1800,2100,2400,2700,
                                3000, 3300)) +
      theme(text = element_text(size=13)))
both_health_data %>% 
  filter(date_code == "2013/2014") %>% 
  mutate(show_edge = feature_code == "S08000031") %>% 
  filter(type_of_hospital == "General Acute Hospital") %>% 
  ggplot(aes(fill = value_per_one_hundred_thousand_people,
                                    geometry = geometry,
             colour = show_edge)) +
  geom_sf() +
  theme_void() + 
  labs(
      fill = "Stays per 100,000 population"
  ) + 
  scale_color_manual(values=c("blue4", "yellow"), guide = "none") +
  theme(
  legend.title = element_text(color = "black", size = 14),
  legend.text = element_text(color = "black", size = 10),
  legend.position = "bottom"
  ) +
  scale_fill_viridis_c(option = "D", trans = "sqrt")

final_final_data <- full_join(final_data, health_board_simply, by = c("hb_assign" = "HBCode")) %>% 
  filter(type_of_hospital == "general acute hospital")

final_final_data
write_csv(count_data, "clean_count_map.csv")
final_count_data  %>% 
  filter(year == "2018/2019") %>% 
  mutate(show_edge = HBName == "Greater Glasgow and Clyde")  %>% 
  ggplot(aes(fill = total, geometry = geometry, colour = show_edge)) +
  geom_sf() +
  scale_fill_viridis_c(option = "D", trans = "sqrt") + 
  scale_color_manual(values=c("blue4", "yellow"), guide = "none") +
  theme_void() + 
  labs(
      fill = "Total stays"
  )  +
  theme(
  legend.title = element_text(color = "black", size = 14),
  legend.text = element_text(color = "black", size = 10),
  legend.position = "right"
  ) 

#Write csv separately and join with geo file in global.

write_csv(final_data, "alcohol_clean_for_map_data.csv")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoc2YpCgphbGMgPC0gcmVhZF9jc3YoIn4vRG93bmxvYWRzL2NsZWFuX2FsY29ob2xfY29kZXMuY3N2IikKaGVhbHRoX2JvYXJkIDwtIHN0X3JlYWQoIi4uL3Jhd19kYXRhL1NHX05IU19IZWFsdGhCb2FyZHNfMjAxOS9TR19OSFNfSGVhbHRoQm9hcmRzXzIwMTkuc2hwIiwgcXVpZXQgPSBUUlVFKQoKaGVhZChoZWFsdGhfYm9hcmQpCiAgCmBgYApgYGB7cn0KaGVhbHRoX2JvYXJkX3NpbXBseSA8LSBzdF9zaW1wbGlmeShoZWFsdGhfYm9hcmQsIGRUb2xlcmFuY2UgPSAyMDAwKQpoZWFkKGhlYWx0aF9ib2FyZF9zaW1wbHkpCmBgYApgYGB7cn0KcGxvdChoZWFsdGhfYm9hcmRfc2ltcGx5KQpgYGAKYGBge3J9CmJvdGhfZGF0YSA8LSBmdWxsX2pvaW4oYWxjLCBoZWFsdGhfYm9hcmRfc2ltcGx5LCBieSA9IGMoImZlYXR1cmVfY29kZSIgPSAiSEJDb2RlIikpCgpib3RoX2hlYWx0aF9kYXRhIDwtIGJvdGhfZGF0YSAlPiUgCiAgZmlsdGVyKGZlYXR1cmVfY29kZSAhPSAiUzkyMDAwMDAzIikKCmJvdGhfaGVhbHRoX2RhdGEKYGBgCmBgYHtyfSAKYm90aF9oZWFsdGhfZGF0YSAlPiUgCiAgZmlsdGVyKGRhdGVfY29kZSA9PSAiMjAxMy8yMDE0IikgJT4lIAogIGdncGxvdChhZXMoZmlsbCA9IHZhbHVlX3Blcl9vbmVfaHVuZHJlZF90aG91c2FuZF9wZW9wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkpKSArCiAgZ2VvbV9zZigpICsKICB0aGVtZV92b2lkKCkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIiwgdHJhbnMgPSAic3FydCIpICsKICBsYWJzKAogICAgICBmaWxsID0gIlN0YXlzIHBlciAxMDAsMDAwIHBvcHVsYXRpb24iCiAgKQpgYGAKYGBge3J9CmRhdGFfem9uZSA8LSByZWFkX2Nzdigifi9Eb3dubG9hZHMvRGF0YXpvbmUyMDExbG9va3VwLmNzdiIpCm5hbWVzKGRhdGFfem9uZSkKYGBgCmBgYHtyfQpuZXdfaGIgPC0gZGF0YV96b25lICU+JSAKICBzZWxlY3QoTEFfQ29kZSwgTEFfTmFtZSwgSEJfQ29kZSwgSEJfTmFtZSkKCm5ld19oYgpgYGAKYGBge3J9CmFsY19yYXdfZGF0YSA8LSByZWFkX2NzdigiLi4vcmF3X2RhdGEvYWxjb2hvbF9yZWxhdGVkX2hvc3BpdGFsX3N0YXRzLmNzdiIpICU+JSAKICBjbGVhbl9uYW1lcygpCmFsY19kYXRhIDwtIGFsY19yYXdfZGF0YSAlPiUgCiAgZmlsdGVyKGRhdGVfY29kZSAlaW4lIGMoIjIwMTYvMjAxNyIsIjIwMTEvMjAxMiIsIjIwMTIvMjAxMyIsICIyMDEwLzIwMTEiLCAiMjAxNS8yMDE2IiwgIjIwMDkvMjAxMCIsICIyMDE0LzIwMTUiLCAiMjAxOC8yMDE5IiwgIjIwMTcvMjAxOCIsICIyMDEzLzIwMTQiKSkgICU+JSAKICByZW5hbWUoeWVhciA9IGRhdGVfY29kZSkgJT4lIAogIG11dGF0ZShtZWFzdXJlbWVudCA9IHN0cl90b19sb3dlcihtZWFzdXJlbWVudCkpICU+JSAKICBtdXRhdGUodW5pdHMgPSBzdHJfdG9fbG93ZXIodW5pdHMpKSAlPiUgIAogIHJlbmFtZShob3NwaXRhbF9hY3Rpdml0eSA9IGFsY29ob2xfcmVsYXRlZF9ob3NwaXRhbF9hY3Rpdml0eSkgJT4lIAogIG11dGF0ZShob3NwaXRhbF9hY3Rpdml0eSA9IHN0cl90b19sb3dlcihob3NwaXRhbF9hY3Rpdml0eSkpICU+JSAKICBtdXRhdGUodHlwZV9vZl9ob3NwaXRhbCA9IHN0cl90b19sb3dlcih0eXBlX29mX2hvc3BpdGFsKSkgJT4lIAogIG11dGF0ZSh5ZWFyID0gZmFjdG9yKHllYXIsIGxldmVscyA9IGMoIjIwMDkvMjAxMCIsICIyMDEwLzIwMTEiLCAiMjAxMS8yMDEyIiwgIjIwMTIvMjAxMyIsICIyMDEzLzIwMTQiLCAiMjAxNC8yMDE1IiwgIjIwMTUvMjAxNiIsICIyMDE2LzIwMTciLCAiMjAxNy8yMDE4IiwgICIyMDE4LzIwMTkiKSkpCgphbGNfZGF0YSAKYGBgCmBgYHtyfQphbGNfY2xlYW4gPC0gYWxjX2RhdGEgJT4lIAogIGZpbHRlcihtZWFzdXJlbWVudCA9PSAicmF0aW8iKSAlPiUgCiAgZmlsdGVyKGhvc3BpdGFsX2FjdGl2aXR5ID09ICJzdGF5cyIpCgphbGNfY2xlYW4KYm90aF9hbGNfZGF0YSA8LSBpbm5lcl9qb2luKGFsY19jbGVhbiwgbmV3X2hiLCBieSA9IGMoImZlYXR1cmVfY29kZSIgPSAiTEFfQ29kZSIpKQpib3RoX2FsY19kYXRhCmBgYApgYGB7cn0Kc3VwZXJfcHVwZXJfZGF0YSA8LSBkaXN0aW5jdChib3RoX2FsY19kYXRhKQpzdXBlcl9wdXBlcl9kYXRhCmBgYAoKYGBge3J9CnN1cGVyX2R1cGVyX2RhdGEgPC0gYWxjX2RhdGEgJT4lIAogIG11dGF0ZShoYl9hc3NpZ24gPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAzMyIgfiAiUzA4MDAwMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDM0IiB+ICJTMDgwMDAwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwNDEiIH4gIlMwODAwMDAzMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAzNSIgfiAiUzA4MDAwMDIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDA1IiB+ICJTMDgwMDAwMTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwMDYiIH4gIlMwODAwMDAxNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDA0MiIgfiAiUzA4MDAwMDMwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDA4IiB+ICJTMDgwMDAwMTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwNDUiIH4gIlMwODAwMDAzMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAxMCIgfiAiUzA4MDAwMDI0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDExIiB+ICJTMDgwMDAwMzEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwMzYiIH4gIlMwODAwMDAyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAxMyIgfiAiUzA4MDAwMDI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDE0IiB+ICJTMDgwMDAwMTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwNDciIH4gIlMwODAwMDAyOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDA0OSIgfiAiUzA4MDAwMDMxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDE3IiB+ICJTMDgwMDAwMjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwMTgiIH4gIlMwODAwMDAzMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAxOSIgfiAiUzA4MDAwMDI0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDIwIiB+ICJTMDgwMDAwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwMjEiIH4gIlMwODAwMDAxNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDA1MCIgfiAiUzA4MDAwMDMyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDIzIiB+ICJTMDgwMDAwMjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwNDgiIH4gIlMwODAwMDAzMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAzOCIgfiAiUzA4MDAwMDMxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDI2IiB+ICJTMDgwMDAwMTYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwMjciIH4gIlMwODAwMDAyNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAyOCIgfiAiUzA4MDAwMDE1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDI5IiB+ICJTMDgwMDAwMzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9jb2RlID09ICJTMTIwMDAwMzAiIH4gIlMwODAwMDAxOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2NvZGUgPT0gIlMxMjAwMDAzOSIgfiAiUzA4MDAwMDMxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfY29kZSA9PSAiUzEyMDAwMDQwIiB+ICJTMDgwMDAwMjQiKSkKYGBgCgpgYGB7cn0KZmluYWxfZGF0YSA8LSBzdXBlcl9kdXBlcl9kYXRhICAlPiUgCiAgZmlsdGVyKCFpcy5uYShoYl9hc3NpZ24pKSAgJT4lIAogIGZpbHRlcihob3NwaXRhbF9hY3Rpdml0eSA9PSAic3RheXMiKSAlPiUKICAgICAgZmlsdGVyKGFsY29ob2xfY29uZGl0aW9uICE9ICJBbGwgYWxjb2hvbCBjb25kaXRpb25zIiwgYWxjb2hvbF9jb25kaXRpb24gIT0gCiAgICAgICAgICAgICAgICJBbGwgbWVudGFsICYgYmVoYXZpb3VyYWwgZGlzb3JkZXJzIGR1ZSB0byB1c2Ugb2YgYWxjb2hvbCAoTSZCKSIsCiAgICAgICAgICAgICBhbGNvaG9sX2NvbmRpdGlvbiAhPSAiQWxsIEFsY29ob2xpYyBMaXZlciBEaXNlYXNlIChBTEQpIikgJT4lIAogIG11dGF0ZShhbGNvaG9sX2NvbmRpdGlvbiA9IHN0cl9yZW1vdmVfYWxsKGFsY29ob2xfY29uZGl0aW9uLCAiTVxcJkJcXCBcXC1cXCAiKSkgJT4lIAogIG11dGF0ZShhbGNvaG9sX2NvbmRpdGlvbiA9IHN0cl9yZW1vdmVfYWxsKGFsY29ob2xfY29uZGl0aW9uLCAiQUxEXFwgXFwtXFwgIikpICU+JQogIGZpbHRlcih0eXBlX29mX2hvc3BpdGFsID09ICJnZW5lcmFsIGFjdXRlIGhvc3BpdGFsIikKYGBgCgoKYGBge3J9CnVuaXF1ZShmaW5hbF9kYXRhJG1lYXN1cmVtZW50KQpsaWJyYXJ5KHBsb3RseSkKYGBgCmBgYHtyfQpnZ3Bsb3RseShmaW5hbF9maW5hbF9kYXRhICU+JSAKICAgICAgZmlsdGVyKHllYXIgPT0gIjIwMTMvMjAxNCIpICU+JQogICAgICBmaWx0ZXIoSEJOYW1lID09ICJHcmVhdGVyIEdsYXNnb3cgYW5kIENseWRlIikgJT4lIAogICAgICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gInJhdGlvIikgJT4lICAKICAgICAgZ2dwbG90KCkgKwogICAgICBhZXMoeCA9IHJlb3JkZXIoYWxjb2hvbF9jb25kaXRpb24sIHZhbHVlKSwKICAgICAgICAgIHkgPSB2YWx1ZSwKICAgICAgICAgIGZpbGwgPSBhbGNvaG9sX2NvbmRpdGlvbikgKwogICAgICBnZW9tX2NvbCgpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsKICAgICAgbGFicygKICAgICAgICB0aXRsZSA9ICJSZWFzb25zIG9mIGxvbmdlc3Qgc3RheXMiLAogICAgICAgIHggPSAiQ29uZGl0aW9uIiwKICAgICAgICB5ID0gIlN0YXlzIHBlciAxMDAsMDAwIikgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBjb29yZF9mbGlwKCkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsMzAwLDYwMCw5MDAsMTIwMCwxNTAwLDE4MDAsMjEwMCwyNDAwLDI3MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMCwgMzMwMCkpICsKICAgICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEzKSkpCmBgYAoKYGBge3J9CmJvdGhfaGVhbHRoX2RhdGEgJT4lIAogIGZpbHRlcihkYXRlX2NvZGUgPT0gIjIwMTMvMjAxNCIpICU+JSAKICBtdXRhdGUoc2hvd19lZGdlID0gZmVhdHVyZV9jb2RlID09ICJTMDgwMDAwMzEiKSAlPiUgCiAgZmlsdGVyKHR5cGVfb2ZfaG9zcGl0YWwgPT0gIkdlbmVyYWwgQWN1dGUgSG9zcGl0YWwiKSAlPiUgCiAgZ2dwbG90KGFlcyhmaWxsID0gdmFsdWVfcGVyX29uZV9odW5kcmVkX3Rob3VzYW5kX3Blb3BsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeSwKICAgICAgICAgICAgIGNvbG91ciA9IHNob3dfZWRnZSkpICsKICBnZW9tX3NmKCkgKwogIHRoZW1lX3ZvaWQoKSArIAogIGxhYnMoCiAgICAgIGZpbGwgPSAiU3RheXMgcGVyIDEwMCwwMDAgcG9wdWxhdGlvbiIKICApICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlNCIsICJ5ZWxsb3ciKSwgZ3VpZGUgPSAibm9uZSIpICsKICB0aGVtZSgKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLAogIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEwKSwKICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIgogICkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJEIiwgdHJhbnMgPSAic3FydCIpCmBgYApgYGB7cn0KZmluYWxfZmluYWxfZGF0YSA8LSBmdWxsX2pvaW4oZmluYWxfZGF0YSwgaGVhbHRoX2JvYXJkX3NpbXBseSwgYnkgPSBjKCJoYl9hc3NpZ24iID0gIkhCQ29kZSIpKSAlPiUgCiAgZmlsdGVyKHR5cGVfb2ZfaG9zcGl0YWwgPT0gImdlbmVyYWwgYWN1dGUgaG9zcGl0YWwiKQoKZmluYWxfZmluYWxfZGF0YQpgYGAKYGBge3J9CmNvdW50X2RhdGEgPC0gZmluYWxfZGF0YSAlPiUgCiAgZmlsdGVyKG1lYXN1cmVtZW50ID09ICJjb3VudCIpICU+JSAKICBncm91cF9ieSh5ZWFyLCBhbGNvaG9sX2NvbmRpdGlvbiwgaGJfYXNzaWduLCBtZWFzdXJlbWVudCkgJT4lIAogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bSh2YWx1ZSkpIApgYGAKYGBge3J9CndyaXRlX2Nzdihjb3VudF9kYXRhLCAiY2xlYW5fY291bnRfbWFwLmNzdiIpCmBgYAoKYGBge3J9CmZpbmFsX2NvdW50X2RhdGEgPC0gZnVsbF9qb2luKGNvdW50X2RhdGEsIGhlYWx0aF9ib2FyZF9zaW1wbHksIGJ5ID0gYygiaGJfYXNzaWduIiA9ICJIQkNvZGUiKSkKYGBgCgpgYGB7cn0KZmluYWxfY291bnRfZGF0YSAgJT4lIAogIGZpbHRlcih5ZWFyID09ICIyMDE4LzIwMTkiKSAlPiUgCiAgbXV0YXRlKHNob3dfZWRnZSA9IEhCTmFtZSA9PSAiR3JlYXRlciBHbGFzZ293IGFuZCBDbHlkZSIpICAlPiUgCiAgZ2dwbG90KGFlcyhmaWxsID0gdG90YWwsIGdlb21ldHJ5ID0gZ2VvbWV0cnksIGNvbG91ciA9IHNob3dfZWRnZSkpICsKICBnZW9tX3NmKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJEIiwgdHJhbnMgPSAic3FydCIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlNCIsICJ5ZWxsb3ciKSwgZ3VpZGUgPSAibm9uZSIpICsKICB0aGVtZV92b2lkKCkgKyAKICBsYWJzKAogICAgICBmaWxsID0gIlRvdGFsIHN0YXlzIgogICkgICsKICB0aGVtZSgKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLAogIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEwKSwKICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiCiAgKSAKYGBgCiNXcml0ZSBjc3Ygc2VwYXJhdGVseSBhbmQgam9pbiB3aXRoIGdlbyBmaWxlIGluIGdsb2JhbC4KYGBge3J9CndyaXRlX2NzdihmaW5hbF9kYXRhLCAiYWxjb2hvbF9jbGVhbl9mb3JfbWFwX2RhdGEuY3N2IikKYGBgCgoKCg==